﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int main()
//{
//	long long n = 0;
//	long long m = 0;
//	long long k = 0;
//
//	scanf("%lld %lld", &n, &m);
//
//	long long n1 = n;
//	long long m1 = m;
//	if (n < m)
//	{
//		n = n ^ m;
//		m = n ^ m;
//		n = n ^ m;
//	}
//	while (k=n % m)
//	{
//		n = m;
//		m = k;
//		k = n % m;
//	}
//	long long z = n1*m1/m;
//	
//	printf("%lld", m+z);
//
//	return 0;
//}
//#include <stdio.h>
////指针+- 整数
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
//	}
//	return 0;
//}
//#include <stdio.h>
//int my_strlen(char* s)
//{
//	char* p = s;
//	while (*p != '\0')
//		p++;
//	return p - s;
//}
//int main()
//{
//	printf("%d\n", my_strlen("abc"));
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	printf("%zd\n", sizeof(char*));
//	printf("%zd\n", sizeof(short*));
//	printf("%zd\n", sizeof(int*));
//	printf("%zd\n", sizeof(double*));
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int m = 0;
//	m = 20;//m是可以修改的
//	const int n = 0;
//	n = 20;//n是不能被修改的
//	return 0;
//} 

//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位（即4个字节）
//64位平台下地址是64个bit位（即8个字节）

//#include<stdio.h>
//int main()
//{
//	int m = 0;
//	int* p = &m;
//	const int* p = &m;//const修饰的是*p，*p不能修改，但是p可以改变
//	int* const p = &m;//const修饰的是p，p不能修改，但是*p可以改变
//	const int* const p = &m;//这样的话*p和p都不能改变了
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int* p;//局部变量指针未初始化，默认为随机值
//	*p = 20;
//	return 0;
//}
//
//
//
//
//
//
//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//	int* p = &arr[0];
//	int i = 0;
//	for (i = 0; i <= 11; i++)
//	{
//		*(p++) = i;
//	}
//	return 0;
//}
//
//
//
//
//
//#include <stdio.h>
//int* test()
//{
//	int n = 100;
//	return &n;
//}

//排序数组中的偶数（从小到大排列），奇数位置不变**********************************************
//#include<stdio.h>
//int main()
//{
//	int arr[10] = { 1,5,3,2,4,7,4,8,0,6 };
//	int arr2[10];
//	int arr3[10];
//	int count = 0;
//	int i = 0;
//	int m = 0;
//	for (i = 0; i < 10; i++)
//	{
//		if (arr[i] % 2 == 0)
//		{
//			arr2[count] = i;
//			arr3[count] = arr[i];
//			count += 1;
//
//			//printf("%d ", arr[i]);
//		}
//	}
//
//
//	for (i = 0; i < count-1; i++)
//	{
//		for (int j = 0; j < count-1 - i; j++)
//		{
//			if (arr3[j] > arr3[j + 1])
//			{
//				int temp = arr3[j];
//				arr3[j] = arr3[j + 1];
//				arr3[j + 1] = temp;
//			}
//
//		}
//	}
//
//
//	for (m = 0; m < count ; m++)
//	{
//		arr[arr2[m]] = arr3[m];
//
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//
//	}
//
//
//
//	return 0;
//}
//***********************************************************************************************
//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	int arr[10] = { 0 };
//	scanf("%d", &n);
//	int i = 0;
//	for (i = 1; i <= n; i++)
//	{
//		arr[i] = i;
//	}
//	for (i = 1; i <= n; i++)
//	{
//		printf("%d\n", arr[i]);
//	}
//	return 0;
//}
#include<stdio.h>
int a[11]; 
int n;
int visit[11];	//记录是否“访问” 
void Find(int step)
{
	if(step==n+1)		//如果找够了，就打印 
	{
		for(int i=1;i<=n;i++)
			printf("%d",a[i]);
		printf("\n");
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			if(!visit[i])//未访问
			{
				a[step]=i;  //保存
				visit[i]=1;  //标记
				Find(step+1);	//递归寻找下一个 
				visit[i]=0;		//回溯（标记为未访问） 
			} 
		}
	}
}
int main()
{
	scanf("%d",&n);
	Find(1); //从第一个开始
 	return 0;
}
